#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#include <stack>
#include <bitset>
#define F first
#define S second
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<long long,int> pii;
const int N=1e5+10,M=2*N;
int e[M],ne[M],idx,h[N];
set<pii> st[N];
int du[N];
struct node
{
	ll w;
	int tr;
	int fa;
	ll val;
}a[N];
void add(int a,int b)
{
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
void dfs(int u,int fa)
{
	for(int i=h[u];~i;i=ne[i])
	{
		int j=e[i];
		if(j==fa) continue;
		
		a[j].fa=u;
		dfs(j,u);
		
		st[u].insert({-a[j].tr,j});
		a[u].tr+=a[j].tr;
		a[u].val+=a[j].val;
	}
	a[u].val+=a[u].w;
	a[u].tr+=1;
}
void solve()
{
	memset(h,-1,sizeof(h));
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].w;
	}
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	dfs(1,-1);
	
	while(m--)
	{
		int op,u;
		cin>>op>>u;
		if(op==1)
		{
			cout<<a[u].val<<'\n';
		}
		else if(st[u].size())
		{
			int son=(*st[u].begin()).S;
			ll val=a[son].val;
			
			st[a[u].fa].erase({-a[u].tr,u});
			st[u].erase(*st[u].begin());
			
			a[u].tr-=a[son].tr;
			a[son].tr+=a[u].tr;
			
			a[u].val-=val;
			a[son].val+=a[u].val;
			
			st[a[u].fa].insert({-a[son].tr,son});
			st[son].insert({-a[u].tr,u});
			
			a[son].fa=a[u].fa;
			a[u].fa=son;
		}
	}
}
int main()
{
	IOS;
	int T=1;
//	cin>>T;

	while(T--)
	{
		solve();
	}

	return 0;
}

